package com.kingpeng.rxjava_common

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log

class MainActivity : AppCompatActivity() {

    val TAG: String = "Kotlin";

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Ld("Test fun : fun sum 1 + 2 is " + sum(1, 2))
        Ld("Test if : fun maxOf 1 and 3 is " + maxOf(1, 3));
        Ld("Test is : fun getStrLength abc.length is " + getStrLength("abc"));
        testForEach();
        testFor();
        testWhile();
        Ld("Test When : fun testWhen(1) is " + testWhen(1));
    }

    fun testWhen(obj: Any): String {
        return when (obj) {
            1 -> "One"
            "Hello" -> "Man"
            is Long -> "is Long"
            !is String -> "Not a string"
            else -> "unknown"
        }
    }

    fun testWhile() {
        Ld("Test While start -----------------");
        // 值不可变
        val items = listOf<Int>(1, 2, 3, 88, -100);
        // 值可变
        var index = 0;
        while (index < items.size) {
            Ld("index : " + index + " item : " + items[index]);
            index++;
        }
        Ld("Test While end -----------------");
    }

    fun testForEach() {
        Ld("Test ForEach start--------------");
        val items = listOf<String>("abc", "nba", "china");
        for (item in items) {
            Ld("item : " + item);
        }
        Ld("Test ForEach end--------------");
    }

    fun testFor() {
        Ld("Test For start--------------");
        val items = listOf<String>("abc", "nba", "china");
        for (index in items.indices) {
            Ld("item : " + items[index] + " index : " + index);
        }
        Ld("Test For end--------------");
    }

    // is : 运算符检测一个表达式是否某类型的一个实例。
    // 如果一个不可变的局部变量或属性已经判断出为某类型，
    // 那么检测后的分支中可以直接当作该类型使用，无需显式转换
    // ? : 当某个变量的值可以为 null 的时候，必须在声明处的类型后添加 ? 来标识该引用可为空。
    fun getStrLength(obj: Any): Int? {
        if (obj is String && obj.length > 0) {
            // `obj` 在该条件分支内自动转换成 `String`
            return obj.length;
        }
        return null;
    }

    fun maxOf(a: Int, b: Int): Int {
        return if (a > b) a else b;
    }

    fun sum(a: Int, b: Int): Int {
        return a + b;
    }

    fun Ld(msg: String): Unit {
        Log.d(TAG, msg);
    }
}
